15-4 O~

類別可以有繼承關係,例如「人」是一種類別,而「學生」是另一種類別,但由於「學生」是「人」特例,因此我們可將「人」看成是基本類別(Base Class),而「學生」則是衍生類別(Derived Class),因此「學生」類別可以繼承「人」類別的性質和方法。善用繼承,可以讓我們使用簡單的方式來描述真實世界的各種關係。

若檢視我們的範例程式目錄,可以看到兩個目錄:@person 和 @student,其中 @person 是描述「人」的類別,而 @student 則是描述「學生」的類別。每個人都是由姓名、性別、身高、體重來定義(相關建構函式可見 @person 目錄下的 person.m),根據這些參數,我們就可以建構「人」的物件,範例如下:

Example 1: 15-物件導向程式設計/person01.mp1 = person('王建民', '男', 1.93, 95) p2 = person('姚明', '男', 2.26, 134) fprintf('王建民的 BMI = %g\n', bmi(p1)); fprintf('姚明的 BMI = %g\n', bmi(p2));p1: 姓名 = 王建民, 性別 = 男, 身高 = 1.93 m, 體重 = 95 kg p2: 姓名 = 姚明, 性別 = 男, 身高 = 2.26 m, 體重 = 134 kg 王建民的 BMI = 25.504 姚明的 BMI = 26.2354

在上述範例中,bmi() 是一個 person 類別的方法,可以計算一個 person 物件的 BMI (Body Mass Index) 值,定義成重量(以公斤為單位)對身高(以公尺為單位)平方的比值。此外在 @person目錄下,我們也定義了顯示物件的函式 display.m,讀者可以自行檢視其內容。

接著我們有一個 student 類別,這是 person 類別的衍生類別,所以它繼承了所有 person 類別的性質和方法,繼承的關係主要是規範在 student 的建構函式,如下:

Example 2: 15-物件導向程式設計/@student/student.mfunction s = student(name, gender, height, weight, department, year) %STUDENT Student class constructor p = person(name, gender, height, weight); % Person class s.department = department; % student 特有的性質 s.year = year; % student 特有的性質 s = class(s, 'student', p); % 定義 s 為 student 物件,且繼承自 p 的類別

在上述建構函式中,可以知道 student 類別共包含六個性質(name, gender, height, weight, department, year),其中前四個性質(name, gender, height, weight)是繼承自 person 類別,而後兩個性質(department, year)則是 student 類別特有的性質。此外,由於 student 繼承 person,因此 student 也可以使用所有 person 的方法,範例如下:

Example 3: 15-物件導向程式設計/student01.ms1 = student('張庭碩', '男', 1.84, 68, '會計系', 3) fprintf('張庭碩的 BMI = %g\n', bmi(s1));s1: 姓名 = 張庭碩, 性別 = 男, 身高 = 1.84 m, 體重 = 68 kg 張庭碩的 BMI = 20.0851

如果你檢視 @student 目錄,可以發覺此類別沒有定義任何方法,但由於 student 繼承 person,因此在上述範例中, student 物件 s1 會自動選用 person 的顯示方法,同時我們也可以呼叫 bmi() 函式來計算 s1 物件的 BMI 值,此函數定義於 @person 目錄之下。(當然,我們也可以在 @student 目錄下編寫另一個檔案 display.m,用來顯示 student 物件,此時 student 物件就會選用此方法來顯示,而不會使用 person 的顯示方法。)


MATLAB程式設計:進階篇